<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8">
    <title>自己实现一个new promise</title>
    <!-- <script src="test.js"></script> -->
</head>
<style type="text/css">

</style>

<body>

</body>
<script>
    //自己实现一个new promise
    function myPromise(fn) {
        var self = this;
        self.status = 'pending';
        self.value = null;
        self.reason = null;
        self.onFulfilled = null;
        self.onRejected = null;
        function resolve(value) {
            if (self.status === 'pending') {
                self.status = 'fulfilled';
                self.value = value;
                self.onFulfilled(self.value); //resolve包装的成功结果
            }
        }
        function reject(reason) {
            if (self.status === 'pending') {
                self.status = 'rejected';
                self.reason = reason;
                self.onRejected(self.reason); //reject包装的失败结果
            }
        }
        fn(resolve, reject);
    }

    myPromise.prototype.then = function (onFulfilled, onRejected) {
        var self = this;
        self.onFulfilled = onFulfilled;
        self.onRejected = onRejected;
    }

    var p = new myPromise(function (resolve, reject) {
        setTimeout(function () {
            resolve('自己实现一个promise源码');
        }, 500);
    });
    p.then(function (res) {
        console.log(res);
    }, function (err) {
        console.log(err);
    });

    //Promise源码总结：  
    // 1.Promise 的构造函数接收一个函数作为参数，这个函数又接收两个参数 resolve 和 reject，分别表示异步操作成功和失败的回调函数。在 Promise 的构造函数中，我们需要定义一个状态 state，表示Promise 的状态，初始值为 pending。同时，我们还需要定义一个value 变量，用来存储异步操作成功时的返回值，以及一个 reason变量，用来存储异步操作失败时的错误信息
    // 2. Promise的 then 方法是 Promise 的核心方法，它接收两个参数onFulfilled 和 onRejected，分别表示异步操作成功和失败时的回调函数。在Promise的then 方法中，我们需要根据 Promise 的状态来执行相应的回调函数。如果 Promise 的状态为 fulfilled，就执行onFulfilled 回调函数，并将异步操作成功时的返回值作为参数传递给它;如果 Promise的状态为 rejected，就执行 onRejected 回调函数，并将异步操作失败时的错误信息作为参数传递给它

    //  自己实现一个promise源码参考链接： https://blog.csdn.net/mangguom23/article/details/119761079


</script>

</html>